/*******************************************************************************
 * Copyright (C) 2010 Chris Wroe
 * 
 * Modifications to the initial code base are copyright of their respective
 * authors, or their employers as appropriate.
 * 
 * This program is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation; either version 2.1 of the License, or (at your option)
 * any later version.
 * 
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
 * details.
 * 
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program; if not, write to the Free Software Foundation, Inc.,
 * 59 Temple Place, Suite 330, Boston, MA 02111-1307
 ******************************************************************************/


package uk.co.wroedevelopments.semanticworkbench.store;

import java.util.Iterator;

import org.neo4j.api.core.Node;
import org.neo4j.api.core.Traverser;
import org.xtext.example.semDsl.Attribute;
import org.xtext.example.semDsl.AttributeDefinition;
import org.xtext.example.semDsl.Concept;
import org.xtext.example.semDsl.Name;

public interface IKnowledgeBase {
	
	public void addOntologyChangeListener(OntologyChangeListener listener) throws Exception;
	
	public void removeOntologyChangeListener(OntologyChangeListener listener) throws Exception;
	
	public Node addConcept(Concept concept);
	
	public Node addTopLevelConcept(Concept c);
	
	public Node addNewSub(Concept parentConcept, Concept c);
	
	public Node addConceptDefinition(Name name);
	
	public void addTopLevelAttribute(AttributeDefinition def);
	
	public void addAttribute(AttributeDefinition def, Attribute parent);

	public Node addConceptInclusionAxiom(Node nodeA, Node nodeB);
	
	public Node addConjunctionAxiom(Node conjunctionNode, Node nodeA, Node nodeB);

	public Node addRoleInclusionAxiom(Node nodeR, Node nodeS);
	
	public Node addPositiveExistentialAxiom(Node nodeA, Node nodeR, Node nodeB );
	
	public Node addNegativeExistentialAxiom(Node nodeS, Node nodeB, Node nodeC );

	public Traverser getAllAxiomOfType(AxiomType conceptInclusion);
	
	public Traverser treeWalk(Node topNode);
	
	public Node getConceptNamed(String conceptName);

	public boolean subsumedBy(Node value, Node testValue);

	public String getNodeName(Node value);
	
}
